import openpyxl
import os

class Excel:
    def __init__(self, semester, chronology, add_minus_statistics,first_or_second,have_PE):
        (self.semester,
         self.chronology,
         self.add_minus_statistics) = self.create_object(semester, chronology, add_minus_statistics)
        (self.semester_sheet,
         self.chronology_sheet,
         self.add_minus_statistics_sheet)= self.create_object_sheet()
        self.row = 5
        self.first_or_second = first_or_second
        self.have_PE = have_PE
    def create_object(self,semester, chronology, add_minus_statistics):
        """
        实例化URL里的工作簿对象
        :param semester:学期表的文件地址
        :param chronology:学年表的文件地址
        :param add_minus_statistics:加减分表的文件地址
        :return:工作簿对象
        """
        return (openpyxl.load_workbook(semester),
                openpyxl.load_workbook(chronology),
                openpyxl.load_workbook(add_minus_statistics))

    def create_object_sheet(self):
        """
        实例化活动表对象(sheet)
        :return:工作表对象
        """
        return (self.semester.active,
                self.chronology.active,
                self.add_minus_statistics.active)

    def fill_sheet(self, file_name):
        """
        填充学年和学期表
        :param file_name: 文件名
        :return: None
        """
        file_path = f"./学生综合素质评价表/{file_name}"
        workbook = openpyxl.load_workbook(file_path)
        sheet = workbook.active
        file_name,_ = file_name.split(".")
        student_id,student_name = file_name[:10], file_name[10:]
        # 学号
        self.semester_sheet[f"B{self.row}"] = student_id
        self.chronology_sheet[f"B{self.row - 1}"] = student_id
        # 性别
        self.semester_sheet[f"C{self.row}"] = student_name
        self.chronology_sheet[f"C{self.row - 1}"] = student_name
        # ========德育成绩========
        # 基本分
        self.semester_sheet[f"F{self.row}"] = sheet["E6"].value
        # 附加分
        self.semester_sheet[f"G{self.row}"] = self.get_additional_points("E11","E14",sheet)
        # 附减分
        self.semester_sheet[f"H{self.row}"] = self.get_minus_points("E16","E26",sheet)
        # 成绩
        self.semester_sheet[f"I{self.row}"] = sheet["E27"].value
        self.fill_chronology("I", "J", "K","E27",sheet)

        # =========智育成绩========
        # 基本分
        self.semester_sheet[f"K{self.row}"] = sheet["E30"].value
        # 附加分
        self.semester_sheet[f"L{self.row}"] = (self.get_additional_points("E32","E38", sheet) +
                                         self.get_additional_points("L4","L6", sheet))
        # 附减分
        self.semester_sheet[f"M{self.row}"] = self.get_minus_points("L8","L10",sheet)
        # 成绩
        self.semester_sheet[f"N{self.row}"] = sheet["L11"].value
        self.fill_chronology("E","F","G","L11",sheet)

        # =========体育成绩========
        # 基本分
        if self.have_PE:
            self.semester_sheet[f"P{self.row}"] = sheet["L14"].value
        else:
            self.semester_sheet[f"P{self.row}"] = sheet["L15"].value
        # 附加分
        self.semester_sheet[f"Q{self.row}"] = self.get_additional_points("L17", "L21", sheet)
        # 附减分
        self.semester_sheet[f"R{self.row}"] = self.get_minus_points("L23", "L24", sheet)
        # 成绩
        self.semester_sheet[f"S{self.row}"] = sheet["L25"].value
        self.fill_chronology("M","N","O","L25", sheet)

        # =========劳动成绩========
        # 基本分
        self.semester_sheet[f"U{self.row}"] = sheet["L29"].value
        # 附加分
        self.semester_sheet[f"V{self.row}"] = self.get_additional_points("L31", "L34", sheet)
        # 附减分
        self.semester_sheet[f"W{self.row}"] = self.get_minus_points("L36", "L38", sheet)
        # 成绩
        self.semester_sheet[f"X{self.row}"] = sheet["L39"].value

        self.semester_sheet[f"Z{self.row}"] = round(sheet["E27"].value * 0.25 + sheet["L11"].value * 0.6 + sheet["L25"].value * 0.1 + sheet["L39"].value * 0.05,2)
        if self.first_or_second == 1:
            self.chronology_sheet[f"Q{self.row - 1}"] = self.semester_sheet[f"Z{self.row}"].value
        else:
            self.chronology_sheet[f"S{self.row - 1}"] = self.semester_sheet[f"Z{self.row}"].value
            self.chronology_sheet[f"U{self.row - 1}"] = round(self.chronology_sheet[f"Q{self.row - 1}"].value + self.chronology_sheet[f"S{self.row - 1}"].value,2)

        self.row += 1

    def get_additional_points(self,start,end,sheet):
        """
        获取总的附加分
        :param start:开始的位置
        :param end: 结束的位置
        :param sheet: 工作表对象
        :return: 各项附加分总和
        """
        # 附加分
        init = 0
        for i in sheet[start:end]:
            try:
                init += i[0].value
            except TypeError:
                pass
            except:
                raise f"{file_name}表里面的{start}-{end}列数据存在问题"
        return init

    def get_minus_points(self,start,end,sheet):
        """
        获取总的附减分
        :param start:开始的位置
        :param end: 结束的位置
        :param sheet: 工作表对象
        :return: 各项附减分总和
        """
        init = 0
        for i in sheet[start:end]:
            try:
                init += i[0].value
            except TypeError:
                pass
            except:
                raise f"{file_name}表里面的{start}-{end}列数据存在问题"
        return init

    def fill_chronology(self,alpha1,alpha2,alpha3,sheet_position,sheet):
        """
        填充学年表
        :param alpha1: 第一学期填写的位置
        :param alpha2: 第二学期填写的位置
        :param alpha3: 两学期分数的总和
        :param sheet_position: 个人表格中数据所在的位置
        :param sheet: 工作表对象
        :return: None
        """
        if self.first_or_second == 1:
            self.chronology_sheet[f"{alpha1}{self.row - 1}"] = sheet[sheet_position].value
        elif self.first_or_second == 2:
            self.chronology_sheet[f"{alpha2}{self.row - 1}"] = sheet[sheet_position].value
            self.chronology_sheet[f"{alpha3}{self.row - 1}"] = self.chronology_sheet[f"{alpha1}{self.row - 1}"].value + self.chronology_sheet[f"{alpha2}{self.row - 1}"].value
        else:
            raise "请输入正确的学期，如果是第一学期，在first_or_second填1，如果是第二学期，填2"

    def save_excel(self):
        """
        保存文件
        :return: None
        """
        self.semester.save("./填写完成/金陵科技学院学生综合素质测评学期汇总表.xlsx")
        self.chronology.save("./填写完成/金陵科技学院学生综合素质测评学年汇总表.xlsx")

if __name__ == '__main__':
    
    # 把每个人的excel文件放在同一个文件夹中,自动读取文件名
    the_folder_of_everyone = r"./学生综合素质评价表"
    file_names = os.listdir(the_folder_of_everyone)

    # 学期表
    semester = r"./金陵科技学院学生综合素质测评学期汇总表.xlsx"
    # 学年表
    chronology = r"./金陵科技学院学生综合素质测评学年汇总表.xlsx"
    # 加减分统计表
    add_minus_statistics = r"./计算机学院学生综合素质测评加减分统计表.xlsx"
    # 手动填入学期，如果是第一学期，填1，如果是第二学期，填2
    first_or_second = 2
    # 当前年级是否开设了体育课，如果开设了，填True,如果没有，填False
    have_PE = True
    # 创建实例
    three_excel = Excel(semester, chronology, add_minus_statistics,first_or_second,have_PE)

    os.makedirs("./填写完成",exist_ok=True)

    for file_name in file_names:
        three_excel.fill_sheet(file_name)
    three_excel.save_excel()
